#include "TelaCliente.h"
#include "..\generico\Funcoes.h"

#include <iostream>

using namespace std;

#define CABECALHO_CLIENTE cout << "Tela de Cliente: " << endl << endl
#define CABECALHO_PESQUISA cout << "Tela de Pesquisa: " << endl << endl
#define CABECALHO_LIVROSENCONTRADOS cout << "Tela de Livros encontrados: " << endl << endl
#define OPCAO_INVALIDA cout << endl << "Favor digitar uma opcao valida!"

TelaCliente::TelaCliente(Controlador* sys):Tela(sys)
{

	do{

    	Funcoes::LimparTela();
    	Funcoes::ImprimeCabecalho();

    	this->Show();
    	this->GetOpcao();
    	this->SubmeteDado();

	}while(this->choice != '4');

}

TelaCliente::~TelaCliente()
{
}

void TelaCliente::Show()
{

	CABECALHO_CLIENTE;
	cout << "1 - Tema" << endl;
	cout << "2 - Autor" << endl;
	cout << "3 - Titulo" << endl;
	cout << "4 - Sair do Menu Cliente" << endl;

}

void TelaCliente::GetOpcao()
{

	cout << "Selecione uma opcao: ";
	cin >> this->choice;

}

void TelaCliente::SubmeteDado()
{

	char confirmacao;
	Interesse interesse;
	vector<Livro> livros;

    switch(this->choice) {

        case '1': {
        	//TODO: Metodo para montar a arvore de pesquisa por TEMA
            break;
        }
        case '2':{

        	this->Sistema->MontaPesquista(Interesse::AUTOR);
        	interesse.SetTipo(Interesse::AUTOR);

    		do{

    			this->usuario = this->Sistema->GetUsuario();
    			interesse.SetValor(this->GetValorPesquisa());
    			livros = this->Sistema->PesquisaInteresses(interesse.GetValor());
    			this->ImprimeLivrosEncontrados(livros);

    			if(livros.size() != 0){
    				this->usuario.AdicionaInteresse(interesse);
    				this->ConfirmaAtualizacao();
    			}else{
    				Funcoes::PausarPrograma();
    			}

    			confirmacao = this->VerificaPesquisa();

    		}while(confirmacao != 'N');

        	break;
        }
        case '3': {
        	//TODO: Metodo para montar a arvore de pesquisa por TITULO
        	break;
        }
        case '4':{
        	cout << endl << "Saindo do Menu Cliente";
        	Funcoes::PausarPrograma();
        	break;
        }
        default:{
            cout << endl << "Favor digitar uma opcao valida";
        }

    }

}

string TelaCliente::GetValorPesquisa(){

	string valor;

	Funcoes::LimparTela();
	Funcoes::ImprimeCabecalho();

	CABECALHO_PESQUISA;

	cout << "Digite o valor para encontrar os livros: ";
	getline(cin, valor);

	return valor;

}

void TelaCliente::ImprimeLivrosEncontrados(vector<Livro> _livros){

	Funcoes::LimparTela();
	Funcoes::ImprimeCabecalho();

	CABECALHO_LIVROSENCONTRADOS;

	if(_livros.size() == 0){
		cout << "Nao foi encontrado nenhum livro com a chave informada!" << endl << endl;

	}else{

			for(int i=0 ; i < (int)_livros.size(); i++){
				Livro livro = _livros[i];
				cout << livro;
			}

	}

}

void TelaCliente::ConfirmaAtualizacao(){

	char confirmacao;

	do{

		cout << endl << "VOCE DESEJA INSERIR OS LIVROS EM SUA LISTA DE INTERESSE ? (S/N)" << endl;
		cin >> confirmacao;

		if(confirmacao != 'S' && confirmacao != 'N'){
			OPCAO_INVALIDA;
			Funcoes::PausarPrograma();
		}

	}while(confirmacao != 'S' && confirmacao != 'N');

	if(confirmacao == 'S')
		this->Sistema->AtualizaCliente(this->usuario);

}

char TelaCliente::VerificaPesquisa(){

	char confirmacao;

	do{

    	Funcoes::LimparTela();
    	Funcoes::ImprimeCabecalho();

    	CABECALHO_PESQUISA;
		cout << "Voce gostaria de pesquisar utilizando outra chave? (S/N)" << endl;
		cin >> confirmacao;

		if(confirmacao != 'S' && confirmacao != 'N'){
			OPCAO_INVALIDA;
			Funcoes::PausarPrograma();
		}

	}while(confirmacao != 'S' && confirmacao != 'N');

	return confirmacao;

}
